/*
 * MyTableModel.java
 *
 * Created on 2 de octubre de 2005, 04:04 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ig.formato.util;

//import ig.formato.conection.util.LoadProperties;
//import com.hxtt.swing.util.TableSorter;
import ig.formato.dto.CampoPlanoDTO;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
//import java.util.Properties;
import javax.swing.table.AbstractTableModel;
//import javax.swing.table.JTableHeader;

public class TableModelC extends AbstractTableModel {
        private java.util.Hashtable<String, ig.formato.dto.CampoPlanoDTO> ht = new java.util.Hashtable<String, ig.formato.dto.CampoPlanoDTO>();        
        private java.util.Hashtable<String, ig.formato.dto.CampoPlanoDTO> htSeleccionados = new java.util.Hashtable<String, ig.formato.dto.CampoPlanoDTO>();        
        private boolean DEBUG = false;
        private boolean[] editables = null;
        private String[] estado = null;
        private String[] estadoAnterior = null;
        private Object[][] object;
        private String[] columnNames = null;
        private Object[][] data = null;
        private boolean delFisico = false;
        private Integer[] columnasDiferentes = new Integer[0];
        private Collection<CampoPlanoDTO> cEliminados = new ArrayList<CampoPlanoDTO>();
        
        public TableModelC(Object[][] object, String[] columnNames, boolean[] editables) {
            this.editables = editables;
            this.columnNames = columnNames;
            if (object != null) {
                this.object = object;
            } else {
                this.object = new Object[0][columnNames.length];
            }
            setData(this.object);
        }
        
        public boolean isDelFisico() {
            return delFisico;
        }
        
        public String[] getEstado() {
            return estado;
        }
        
        public void setData(Object[][] _data) {
            ht = new java.util.Hashtable<String, ig.formato.dto.CampoPlanoDTO>();
            if (_data != null) {
                data = new Object[_data.length][columnNames.length];
                for (int i = 0; i < _data.length; i++) {
                    for (int j = 0; j < columnNames.length; j++) {                    
                        this.data[i][j] = _data[i][j];                        
                    }
                    this.ht.put(((ig.formato.dto.CampoPlanoDTO)_data[i][0]).getNombre(), (CampoPlanoDTO) _data[i][0]);
                }
            } else {
                this.object = new Object[0][columnNames.length];
                this.data = new Object[0][columnNames.length];
                this.ht.clear();
            }
            this.fireTableDataChanged();
            this.fireTableDataChanged();
        }
        
        private void copyEstadosNuevos() {
            estadoAnterior = new String[estado.length];
            for (int i = 0; i < estado.length; i++) {
                estadoAnterior[i] = estado[i];
            }
        }
        
        private void copyEstadosViejos() {
            for (int i = 0; i < estadoAnterior.length; i++) {
                estado[i] = estadoAnterior[i];
            }
            copyEstadosNuevos();
        }
        
        //super.addTableModelListener()
        public int getColumnCount() {
            return columnNames.length;
        }
        
        public int getRowCount() {
            return data.length;
        }
        
        public String getColumnName(int col) {
            return columnNames[col];
        }
        
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
        
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
        
        public boolean isCellEditable(int row, int col) {
            if (editables[col] == true) {
                return true;
            } else {
                return false;
            }
        }
        
        public Object[][] getData() {
            return this.data;
        }
        
        public Object[][] getObjet() {
            return this.object;
        }
        
        public void setValueAt(Object value, int row, int col) {
            
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")");
                System.out.println("New value of data:");
                printDebugData();
            }
            boolean existe = false;
            for (int i = 0; i < columnasDiferentes.length; i++) {
                if ((columnasDiferentes[i].intValue() - 1) == col) {
                    for (int j = 0; j < data.length; j++) {
                        if (data[j][col].toString().trim().equals(value.toString().trim()) && j != row) {
                            existe = true;
                            break;
                        }
                    }
                }
                if (existe) {
                    break;
                }
            }
            
            if (existe) {
                data[row][col] = data[row][col];
            } else {
                data[row][col] = value;
                if (col == 1) {
                    ((CampoPlanoDTO)data[row][0]).setActivo((Boolean) value ? 1 : 0);
                }
            }
            setData(data);
            this.fireTableDataChanged();
        }
        
        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();
            
            for (int i = 0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j = 0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
        }
        
        public synchronized void moverArriba(int row) {
            Object[][] data_1 = new Object[this.data.length][this.getColumnCount()];
            for (int i = 0; i < data_1.length; i++) {
                for (int j = 0; j < this.getColumnCount(); j++) {
                    data_1[i][j] = data[i][j];
                }
            }
            for (int i = 0; i < data_1.length; i++) {
                if (i == row) {
                    for (int j = 0; j < this.getColumnCount(); j++) {
                        this.data[i - 1][j] = data_1[i][j];
                    }
                    for (int j = 0; j < this.getColumnCount(); j++) {
                        this.data[i][j] = data_1[i - 1][j];
                    }
                    ((CampoPlanoDTO)this.data[row-1][0]).setOrden(row);
                    ((CampoPlanoDTO)this.data[row][0]).setOrden(row + 1);
                    break;
                }
            }
            this.fireTableDataChanged();
            this.fireTableDataChanged();
        }
        
        public synchronized void moverAbajo(int row) {
            Object[][] data_1 = new Object[this.data.length][this.getColumnCount()];
            for (int i = 0; i < data_1.length; i++) {
                for (int j = 0; j < this.getColumnCount(); j++) {
                    data_1[i][j] = data[i][j];
                }
            }
            for (int i = 0; i < data_1.length; i++) {
                if (i == row) {
                    for (int j = 0; j < this.getColumnCount(); j++) {
                        this.data[i + 1][j] = data_1[i][j];
                    }
                    for (int j = 0; j < this.getColumnCount(); j++) {
                        this.data[i][j] = data_1[i + 1][j];
                    }
                    ((CampoPlanoDTO)this.data[row+1][0]).setOrden(row);
                    ((CampoPlanoDTO)this.data[row][0]).setOrden(row - 1);
                    break;
                }
            }
            this.fireTableDataChanged();
            this.fireTableDataChanged();
        }
        
        int id=-1;
        boolean end=true;
        public synchronized void nuevo(String name,boolean _end,String classs) {
            this.end=_end;
            nuevo(name.toUpperCase(),classs);
            this.end=true;
        }
        public synchronized void nuevo(String name,String classs) {
            Object[][] data_1 = new Object[this.data.length + 1][this.getColumnCount()];
            CampoPlanoDTO tr = new CampoPlanoDTO();           
            tr.configuracionDTO().setClasse(classs);
            //aplica la configuracion por defecto

            try {
                Utilidades.setConfDefault(tr);
            } catch (IGFormatoException iGFormatoException) {
            }

            tr.setActivo(1);            
            tr.setTipo(0);
            boolean seguir = true;
            while (seguir) {
                tr.setId(id--);
                seguir = false;
                for (int i = 0; i < data.length; i++) {
                    if (data[i][0].toString().toUpperCase().trim().equals("#"+name+(end?"-"+Math.abs(tr.getId()):""))) {
                        end=true;
                        seguir = true;
                        break;
                    }
                }
            }
            tr.setNombre("#"+name+(end?"-"+Math.abs(tr.getId()):""));
            for (int i = 0; i < data_1.length; i++) {
                for (int j = 0; j < this.getColumnCount(); j++) {
                    try {
                        data_1[i][j] = data[i][j];
                    } catch (Exception e) {
                        tr.setOrden(i);
                        if (j == 0) {
                            data_1[i][j] = tr;
                        } else {
                            data_1[i][j] = tr.getActivo().equals(1) ? true : false;
                        }
                    }
                }
            }
            this.data = data_1;
            this.fireTableDataChanged();
            this.fireTableDataChanged();
        }

        public synchronized void eliminar(int row) {
            Object[][] data_1 = new Object[this.data.length - 1][this.getColumnCount()];
            int x = -1;
            for (int i = 0; i < data.length; i++) {
                if (i != row) {
                    x++;
                }
                for (int j = 0; j < this.getColumnCount(); j++) {
                    if (i != row) {
                        data_1[x][j] = data[i][j];
                    }
                }
            }
            for (int i = 0; i < data.length; i++) {
                ((CampoPlanoDTO)data[i][0]).setId(i++);
            }
            
            this.data = data_1;
//            CampoPlanoDTO dtoDel = getHt().get(row);
//            if (dtoDel.getId() != null) {
//                this.cEliminados.add(dtoDel);
//            }
//            getHt().remove(row);
//            java.util.Hashtable<Integer, ig.formato.dto.TipoRegistroDTO> newHt = new java.util.Hashtable<Integer, ig.formato.dto.TipoRegistroDTO>();
//            boolean okNull = false;
//            for (int i = 0; i < ht.size(); i++) {
//                ig.formato.dto.TipoRegistroDTO dto = ht.get(i);
//                if (dto != null && !okNull) {
//                    newHt.put(dto.getOrden(), dto);
//                } else {
//                    okNull = true;
//                    dto = ht.get(i + 1);
//                    dto.setOrden(i);
//                    newHt.put(dto.getOrden(), dto);
//                }
//            }
//            this.ht = newHt;
            this.fireTableDataChanged();
            this.fireTableDataChanged();
        }
        
        public Integer[] getColumnasDiferentes() {
            return columnasDiferentes;
        }
        
        public void setColumnasDiferentes(Integer[] columnasDiferentes) {
            this.columnasDiferentes = columnasDiferentes;
        }
        
//        public java.util.Hashtable<String, ig.formato.dto.CampoPlanoDTO> getHt() {
//            return ht;
//        }
        
//        public void setHt(java.util.Hashtable<String, ig.formato.dto.CampoPlanoDTO> ht) {
//            this.ht = ht;
//            this.data = new Object[ht.size()][2];
//            int key = 0;
//            int size = 0;
//            int row = 0;
//            while (true) {
//                CampoPlanoDTO _dto = ht.get(key++);
//                if (_dto != null) {
//                    size++;
//                    this.data[row][0] = _dto;
//                    this.data[row++][1] = _dto.getActivo().equals(1) ? true : false;
//                }
//                if (size >= ht.size()) {
//                    break;
//                }
//            }
//            this.fireTableDataChanged();
//            this.fireTableDataChanged();
//        }
        
        private Object[][] getDataExcluir(int row) {
            Object[][] dataEx = new Object[this.data.length - 1][this.columnNames.length];
            int ii = 0;
            for (int i = 0; i < data.length; i++) {
                if (i != row) {
                    for (int j = 0; j < columnNames.length; j++) {
                        dataEx[ii][j] = data[i][j];
                    }
                    ii++;
                }
            }
            return dataEx;
        }
        
        public Collection<CampoPlanoDTO> getCEliminados() {
            return cEliminados;
        }
        
        private void setSeleccionados(Hashtable<String, CampoPlanoDTO> ht) {
            this.htSeleccionados = ht;
            for (int i = 0; i < data.length; i++) {
                if(ht.get(data[i][0].toString())!=null)
                    data[i][1]=true;
            }
            this.fireTableDataChanged();
            this.fireTableDataChanged();
        }
    }